Repository navigation
Wayline: a full-stack ride-hailing sample, its CI and an Initializr template - #5984
Conversation
…emplate scripts/wayline is one Maven project in one language: a Codename One app styled with CSS, and a Codename One Backend server. The role the server gives an account decides what it opens on: a rider's map, a driver's screen or an administrator's console, on a phone, on the desktop and hosted by the server itself in a browser. The server keeps its data in ORM entities behind repositories, with transactional services and Flyway-style migrations, and runs on SQLite, PostgreSQL, MySQL and MariaDB. It has sign-in through the built-in authorization server, phone verification, driver applications, matching, payments (simulated or Stripe), statistics and a live WebSocket channel. The app reports usage to Codename One analytics after consent. Tested like hellocodenameone: server tests on the JVM and as a native binary, simulator end-to-end tests with screenshots on phone and desktop, a headless-browser check of the hosted app, and a generated-project check (.github/workflows/wayline.yml). The Initializr offers it as a template, kept in step by scripts/sync-initializr-wayline.py, and the developer guide gains a user's and an implementor's chapter. Framework changes the sample needed or uncovered: - cn1:backend-webapp and the Gradle backendWebApp task build the app for the browser and let the server host it. - Shared-module contracts in an app reactor; ResponseStatusException; ConcurrencyFailureException for write conflicts and deadlocks, which MariaDB's snapshot isolation reports where other engines change no row. - Build-time weaving no longer exposes private types in generated code. - ParparVM: a receiver that escapes is no longer retired at frame exit. - Vector maps: tile queue with stand-ins, label collision grid, halos, road hierarchy, kinetic pan, zoom about the cursor. - JavaScript port: geolocation no longer blocks the EDT waiting for a position that never arrives; asynchronous XHR; coalesced accessibility refresh; released text layers. - JavaSE test runner retires each test's threads and listeners, and a killed test process is reported as such. - GridLayout preferred height counts implicit rows; GeneralPath grows geometrically; JavaSE mixed-font width uses advances. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 12 screenshots: 12 matched. |
|
@codex review |
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Cloudflare Preview
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6794d2d704
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Compared 206 screenshots: 206 matched. |
|
Compared 170 screenshots: 170 matched. Native Android coverage
✅ Native Android screenshot tests passed. Native Android coverage
Benchmark ResultsDetailed Performance Metrics
|
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
|
Compared 185 screenshots: 185 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows x64Runner CPU: AMD64 Family 25 Model 17 Stepping 1, AuthenticAMD (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in
Result: no regression |
Gradle: a project in Java and Kotlin failed in compileJava with two copies of one generated mapper. Kotlin's pass compiles the Java it has not seen yet only to resolve types, and that output was read as a dependency's, so a @mapped Java class was mapped by both passes. AnnotationProcessing now takes the class directories that are the module's own and offers nothing out of them. wayline.yml: the simulator job runs in the pr-ci-container image and the workflow could not pull it without packages: read. Sample server: - A refund is refused while a tip on the ride is still being charged, so a tip can no longer land on a ride that was refunded without it. - A ride left completed with its payment pending is settled by a scheduled pass; settling is safe to repeat. - The card limit is enforced where a card is saved, not only where a setup starts. - Two registrations racing for one e-mail answer 409, not a server error. - Changing an account's roles closes the live channel it has open. Sample client: tokens are stored under a name made from the server's address, and cleared when the address changes, so one server's tokens are never sent to another. Maps: a map removed while gliding is taken off the form that animates it, and a failed tile is asked for again when its delay runs out, without waiting for something else to repaint the map. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 185 screenshots: 185 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows arm64Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in
Result: no regression |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
The vector map engine draws differently on this branch, so the four map screenshots are reseeded from this branch's CI captures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ght up The JavaScript port on this branch brings the ARIA overlay up to date after the screen goes quiet rather than on every change, so a bounds read 150ms after a wheel event could still describe the list part way through the scroll, and the click then selected a different sample. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…S 27 map baselines build-ios-app.sh checked that MAVEN_HOME holds a Maven and then ran ./mvnw regardless, so the Wayline iOS job failed with 'No such file or directory'. It now uses the application's wrapper where there is one and that Maven otherwise, as build-android-app.sh does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 163 screenshots: 163 matched. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed the macOS map baselines A name that follows a bend is drawn a straight stretch at a time. The stretches were laid out by each letter's width measured on its own, which a font with kerning sets wider than the same letters drawn together, so on iOS and Mac Catalyst a name read "Bro adway" where the road turned. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e18980f1b5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Compared 185 screenshots: 185 matched. Benchmark ResultsDetailed Performance Metrics
|
|
Compared 185 screenshots: 185 matched. ParparVM vs HotSpot (JDK 25): Linux x64Runner CPU: AMD EPYC 9V45 96-Core Processor (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in
Result: no regression |
|
Compared 185 screenshots: 185 matched. ParparVM vs HotSpot (JDK 25): Linux arm64Runner CPU: Neoverse-N2 (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in
Result: no regression |
- A charge that fails without the processor saying whether it took the money leaves the ride pending and is asked for again under the same key; only a refused card is a failed payment. The same for a tip, which stays on the ride and can be sent again with the same amount. - A rider's two requests and two rides choosing one driver now take turns on the rider's and the driver's row, so neither ends in two rides. - The limit on guesses at a phone code is applied by the statement that counts the guess. - The driver role is not withdrawn from a driver who is on a ride. - A reconnect timer left over from before the live channel was restarted no longer opens a second connection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…wo prose fixes The template check built the generated app with no display, and the theme compiler opens a window; it now takes a virtual display from xvfb-run on a Linux machine without one, as server.sh does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… mode says so to the server Closing an account is refused while the driver's earnings balance is above zero, since the retired name could never cash it out. Leaving the driver's side while the session is still there reports the driver off line, and a driver-status answer arriving after navigation no longer restarts the shift. Sign-out revocation and charges past the retry window are left as they are, and the code says why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c4d1a2c28e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…he settlement sweep takes the oldest rides first A save answered after another account signed in no longer erases that account's unsent mark. The payment sweep reads its page oldest first, so a backlog cannot keep old rides behind new ones until they age out. A stale account load still completes, and the JavaScript port's XHR listeners are plain worker closures freed with the request; the code says why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5a6d08a8da
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…very piece of it The failure of a level fetched for overzoomed pieces was recorded only against the pieces then waiting, so each further piece of the same tile -- one per sibling within a paint when the source refuses at once, or every piece a pan brings into view -- asked the source for it again with no back-off. It is now recorded under the ancestor's own key and consulted before the ancestor is asked for. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6d53e8a4e8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… the outer build's profiles The demo fortnight's card tips had no tip reference, so the driver's earnings and a refund skipped them while the receipts showed them. The nested JavaScript build of backend-webapp now receives the profiles turned on and off with -P. The demo seeding marker stays an account, and the code says why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b7a3f81a09
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ting one each A callback handed to the page keeps an entry in the runtime's worker callback table for good, so a new GeoCallback per getCurrentLocation and per watch was never released. The manager now owns one callback for one-shot answers, taken by whoever is waiting, and one for watches. URLDecoder leaves an unknown encoding to the first escape, and the code says why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9c125f4818
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… holds the profile first A tip for a ride whose driver has closed the account is refused, since it would be credited to a name nobody can cash out. A guess at the phone code takes the profile hold before the code row, the order a closure takes them in. Withdrawing the driver role with earnings owed stays allowed, and the code says why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
When a module sets <encoding> in the active maven-compiler-plugin compile execution instead of the plugin-level configuration, Maven's lifecycle compiles with that encoding, but this reads only compiler.getConfiguration() and falls back to a property or UTF-8. The backend packager then recompiles the same sources using a different charset, so non-ASCII source can fail packaging or produce different identifiers and string literals; resolve encoding from the same active compiler execution already selected for the other compiler options.
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…n first backend-package and backend-test recompile the module's sources, and took their encoding from the compiler plugin's own configuration only, so a module declaring <encoding> on its compile execution was recompiled with a different charset than the lifecycle used. The execution already selected for the other compiler options is now read first. The tip-in-flight comment is corrected, and URLEncoder says why an unknown encoding waits for the first escape. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
…e says why Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 445229cfd0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Window.setTimeout handed every Java handler a permanent worker callback id, and the host kept a proxy for it, so each timeout leaked both. A one-shot timer now forgets both sides when it fires or is cleared, and the semantic-refresh timer reuses one stable handler. A browser bundle with a link back to its own ancestor is refused when the link is reached instead of being copied into itself. The Gradle task's comment now points at the never-up-to-date registration, and the duplicate of that registration is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
|
Codex Review: Didn't find any major issues. You're on a roll. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
…4 translator) #5984 (merged) rebaselines the same two rows from the same values, which the baseline checker rejects. Its rows stay; this PR's getCallers memory improvement on those two runners is re-measured on top of both from the next CI run. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…baselines Both rows were rebaselined from the value master's overlays had already moved, which the resolver refuses as two changes that did not see each other. They now start from the merged result and keep its time and tolerances; only memory is ours. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ainder, detach release - ContactFilter2D: a trigger is never filtered by the normal angle, as Unity documents for useTriggers. - Mathf.Abs(int) goes through System.Math.Abs: Unity documents a non-negative result, which the smallest int cannot have. - Rigidbody2D.mass refuses a value that is not positive, so the property and the simulation agree. - A looping ParticleSystem keeps the time a step runs past its end and fires the bursts of every cycle the step crosses. - GameView lets go of the on-screen controls and the pointer when it is detached in the middle of a touch. - The Unity gallery prebuilt cache key hashes the whole plugin, build-engine and project-model. - Comments record why String.Split with one null separator and the fixed default Random seed stay as they are. - perf: macOS objectAllocation RAM recorded on top of #5984's row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Run Unity 2D projects as Codename One applications
A Unity project's Assets and ProjectSettings in common/src/main/unity build
unmodified: the .NET SDK compiles the C# scripts, maven/cil-translator turns
the assembly into Java class files and compiles every scene, prefab,
animator controller, clip, tile map and particle system to reflection-free
Java, and maven/unity-compat is the runtime they run against (a .NET base
library, the UnityEngine API over com.codename1.gaming, and our own
TextMesh Pro and Cinemachine implementations). Maven (compile-unity,
import-unity-project) and Gradle (compileUnity) share UnityProjectBuilder.
Both modules sit behind the unity-compat profile and are published by the
release.
Float results have to match C# on every target, so native builds get
-ffp-contract=off and the JavaScript target rounds float results with
Math.fround.
Bugs this uncovered and fixes outside the new modules, each with a test:
- ParparVM JavaScript: wide stack shuffles, MULTIANEWARRAY dimension pops,
a call result compared with FCMP/DCMP evaluated more than once, SWAP
losing the lower value.
- ParparVM native: arraycopy/clone of an array of primitive arrays took
the primitive path.
- GameView: a key repeat released a held key; a focused hosted child kept
the multi-touch arrays from the view.
- Box2D: chain against chain threw in World.popContact; the broad phase
allocated a merge buffer on every step above 31 pairs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity project test: hide dotnet without dropping its directory; arm64 perf baseline
On the Ubuntu runner dotnet is linked into /usr/bin, so dropping every PATH
directory that holds it also dropped env, bash and mvn. The directory is now
shadowed by links to everything in it except dotnet.
objectAllocation RAM on Neoverse-N2 is bimodal; the row is recalibrated from
this run and three master runs with a wider RAM tolerance. No improvement is
claimed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: review findings, JavaScript numeric fixes, chart transform
Review findings (rationale for the ones left alone is in comments at the
code concerned):
- Install the view's services (PlayerPrefs store, audio, platform) before
the first scene wakes.
- A coroutine started from Start or Update resumes its first null yield on
the next frame.
- Time.timeSinceLevelLoad restarts on a scene load.
- Application.platform and isMobilePlatform come from the host platform.
- Signed division and remainder of MinValue by -1 throw OverflowException,
as does System.Math.Abs of MinValue.
JavaScript screenshots: XYChart rotated the canvas and rotated it back,
which with float-rounded angles leaves a transform 1e-14 off identity, and
the JavaScript port draws DOM text only for an exact identity. XYChart and
ChartComponent now restore the transform they were handed, and the port's
DOM text decision tolerates that residue.
A differential fixture against the JVM found four older JavaScript target
bugs: int to float/double read an un-normalized int, float/double to int
wrapped instead of saturating, a static read before its first write was
undefined, and Float.toString printed the double.
The offscreen check now runs on every scene sample in the integration
test. It found: a flick release delivered at the press point because
CodenameOneImplementation aliased the shared pointer arrays, GameView
missing single finger presses after the first drag, and a sub-image cache
keyed by corner only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: reseed six JavaScript theme goldens, keep CodeQL off the numeric fixture
The JavaScript target now truncates a float product the way the JVM does, so
the six theme screens that size from one move by a pixel; the goldens are this
run's CI captures. JsNumericDifferentialApp compares narrowing compound
assignments against the JVM on purpose and joins the other compiler fixtures
CodeQL does not read.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity guide: Application.platform, isMobilePlatform and timeSinceLevelLoad
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: second review round, macOS gradient golden, x64 perf baseline
Base library: LINQ operators dispose their enumerators on every exit, Enum
values keep their underlying type and unsigned order, Enum.Parse takes comma
lists, HasFlag/CompareTo/IsDefined refuse another enum's member, String.Format
rejects a lone closing brace, Trim follows Char.IsWhiteSpace, typeof(int) and
typeof(uint) are distinct, a float key's two zeros are one key, and a Java
exception thrown by the runtime is caught by a script's catch (Exception).
AudioSource.time seeks the device's media and accounts for pitch.
The macOS draw-gradient golden is this branch's CI capture: with
-ffp-contract=off the mutable-image ellipse edge now equals the on-screen one.
Linux x64 perf baseline rows recalibrated per runner CPU from PR and master
runs; the shift is present on master at the base commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: third review round
Text images are released when a label stops showing them: the core sprite
renderer gains releaseTexture, and the Unity view's text cache is bounded.
yield return of a bare IEnumerator runs the child before the parent resumes.
Time's unscaled values follow the fixed step inside FixedUpdate.
List and Dictionary copy constructors. GameObject.Find walks a path.
GetComponentInChildren always searches the object asked. Char.IsDigit covers
the Unicode decimal digits. Two scripts with one file name are told apart by
their source path. The incremental build stamp hashes content and holds no
times or absolute paths, so a built project can move between machines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: screenshot tests in the hellocodenameone suite
A gallery project of eight scenes, one per feature area, is compiled into the
test app; each test advances a held clock a fixed number of frames and
captures. scripts/unity-gallery-prebuilt.sh packs the translated project so
a job without the .NET SDK can build the app.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: transpile the screenshot gallery once on Linux for every port
unity-gallery-prebuilt.yml builds the pack behind a cache and uploads it;
every workflow that builds the hellocodenameone app unpacks it before the
build, so no macOS, Windows or Android job needs the .NET SDK. A consumer job
in unity-compat.yml holds the no-SDK path. A build whose compiled output does
not match its sources or jars now says so.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: give every hand-assembled translation the runtime, fix the pack digest
Linux, Windows and JavaScript builds of the test app listed their class
directories by hand and never saw a dependency jar; the common module now
stages its runtime class path where they read it. The compile-unity tool
class path took the translator's test dependencies, so the pack's digest
covered the consumer's own core jar; it is runtime scope now, and a mismatch
names the part and the first entry that differs. The eight Unity tests are a
port-status feature.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* GPU: the framebuffer's alpha accumulates coverage on every backend
The Unity gallery's Canvas scene has a panel that is black at 40% over the
camera's background. Android and Windows rendered 0.6 x background; Linux
rendered it LIGHTER than the background and JavaScript a third too light.
Both used one glBlendFunc(SRC_ALPHA, ONE_MINUS_SRC_ALPHA) for all four
channels, so the frame's alpha became sa*sa + (1-sa) = 0.76 under the panel.
The colour was right; the frame was then composited with that alpha -- by
cairo over the form on Linux, as a premultiplied canvas on JavaScript.
The alpha channel now takes ONE / ONE_MINUS_SRC_ALPHA on Linux, JavaScript,
Android, JavaSE (JOGL) and Metal, which is what Direct3D already did, and
RenderState.BlendMode documents it. The JavaSE software device weights
additive light by the source alpha, as every GPU backend does.
GpuBlendContractTest runs the blend equation with each backend's factors;
parparvm-tests.yml names the sources it reads. The offscreen scene check
asserts the panel against the background.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Native Linux and Windows: a native: font keeps the style its name asks for
The Unity gallery's TextMeshPro scene draws a bold and an italic line, and
both came out in the regular face on native Linux and Windows. The runtime
asks the portable way -- createTrueTypeFont("native:MainBold", ...)
.derive(px, STYLE_PLAIN) -- so the style is in the name alone.
Linux mapped every native: name to regular Sans. Windows read the style at
load and then rebuilt the derived font from derive's weight only. Both now
keep it; graphics-draw-string on those ports draws its MainBold, MainBlack
and Italic* lines styled for the first time and will need reseeding.
NativeFontStyleContractTest compiles the two name parsers alone and holds
the derive paths by source; parparvm-tests.yml names the files it reads.
Also: the complete license header on four files the blend fix touched, and
the Unity gallery goldens for Android and JavaScript, plus the six scenes
without text for Linux (x64, arm64) and Windows, from CI run captures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: paint text on the event dispatch thread, wherever the frame runs
A text command was painted on the frame's thread. On iOS that is the main
thread, while the port keeps one "image being drawn into" for the whole
process: a component painted to the screen meanwhile ends it, and a string
on its way to the text's image is dropped silently. A text is painted once
and cached, so a line lost that way never came back -- the right-aligned
line of the TextMeshPro gallery scene, in the iOS capture.
A frame off the event dispatch thread now asks it for the text by
callSerially and never waits; the pixels come back as an RGBImage. Until
they arrive a label shows its previous text. A frame on the event dispatch
thread paints at once, as before.
SceneShots.checkOffEdt holds the event dispatch thread and draws frames
off it for every gallery scene; the offscreen checks that assert a whole
frame now draw it on the event dispatch thread.
Also: Unity goldens for iOS (Metal, newest runtime) and the Canvas and
TextMeshPro scenes on Linux and Windows; reseeds on Linux and Windows for
the screens whose native: bold and italic fonts are now honoured; and a
recalibrated Windows x64 translator row in the PR's perf overlay.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: value semantics, coroutine and Instantiate order, audio pause and loop
Translator and base library, each held by a console line compared with
dotnet or a sample trace line:
- Instantiate gives a clone its own copy of a [Serializable] class field,
and of the elements of an array or list of them.
- Generated struct equality treats NaN fields as equal, as
ValueType.Equals does.
- A view over a struct array hands out copies: LINQ over one saw later
writes to the array, and ToList shared its values.
- A null out of erased code reads as default(T), for a struct and for a
primitive: FirstOrDefault on an empty list of structs was null.
- Copying a value tuple copies a struct it holds.
- Atan2 and Atan keep the sign of zero and answer for infinities.
- Mathf.Approximately uses the relative term with a floor of eight
epsilons; the floor of 1e-5 made everything near zero equal.
Runtime:
- WaitForFixedUpdate asked for inside a fixed step waits for the next.
- Instantiate of a child, with no parent or in world space, keeps the
original's world position and rotation.
- Animator.Play without a time leaves a state that is playing alone.
- AudioListener.pause stops every source's clock and holds the output's
voices; AudioSource.loop set while playing reaches the voice.
A delegate adapter does not copy a struct argument: a translated target
already copies one it writes, and the comment there says so.
Also: the prebuilt gallery workflow listed its archive into grep -q, which
failed the pipeline whenever grep left first; and hello RAM rows for two
Windows runners in the PR's perf overlay, where the suite now runs the
Unity scenes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: screenshot goldens for iOS, tvOS and Mac Catalyst
The eight gallery scenes on iOS (Metal), tvOS and Mac Catalyst, and the
TextMeshPro scene on the newest iOS runtime, which was held back until its
right-aligned line was drawn. All from CI captures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Perf overlay: drop the Linux hello RAM row master has since rebaselined
The row moved hello RAM on Xeon Platinum 8573C from 0.732x to 0.905x
because master at the base commit measured the same. Master's base now
carries 0.876x for it at the same 20% tolerance, which this pull
request's 0.905x is inside, so the overlay no longer needs to say
anything about that row -- and saying it from the old value is what the
gate refuses.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Apple CI: one watch slice, one test server per run, one notification XCTest
The iOS screenshot legs sit at their 95 minute limit, on master as on this
branch. Measured, the screenshot suite is 7.5 minutes of it; the rest is
compiling, and two thirds of what is compiled is not the iOS app.
- The embedded watch app was built for arm64 AND x86_64 whenever the
destination was an iPhone: 9,880 of 14,834 compile units, 21 to 34
minutes. The CI builds now hold it to the host's slice through the
xcconfig they already pass. The generated project is not changed.
- The screenshot test server was built by every Apple job, 3 to 10 minutes
each. The port build makes it once and the jobs take it from the bundle,
as Linux and Windows already do; a job without it builds it as before.
- The simulator booted ahead of the Xcode 27 leg's compile is shut down
once the boot is proven; the test script boots it when it needs it.
- The packaging job no longer runs the local notification XCTest, which
the native job runs from the same sources: 23 to 38 minutes of a second
compile for the same 0.17 seconds of tests.
No timeout is raised.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: unsigned boxes, delegate types, Math.Pow, deleted-project cleanup
Review findings:
- A boxed byte, ushort, uint or ulong shared the signed type's JDK box, so
it formatted, compared and type-tested as that type (a uint of 3000000000
printed negative, `o is int` held for a uint). They have their own box
classes; signed types keep the JDK's.
- Delegate.Combine and Remove throw ArgumentException for two delegates of
different delegate types, as .NET does.
- Math.Pow agrees with .NET for negative bases with large whole exponents,
infinities, NaN and signed zero.
- A Unity project deleted after a build takes its generated sources and
translated classes with it, from Gradle and from Maven, instead of leaving
them to be compiled and packaged until clean.
Found on the way:
- ParparVM's native Math.floor and Math.ceil went through a long, wrong from
2^63 up and for NaN and infinities.
- A C# array stored in an IEnumerable local, field, element or return value
was not wrapped, only one passed as an argument.
- Math.Truncate was missing; Math.Round lost the sign of a negative zero.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: struct arrays from generic members, null receivers, raycast layer
Review findings:
- A generic member returning an array of a struct type (List<Vector2>.ToArray,
Enumerable.ToArray) stopped the translation; it now answers a fresh array
of copies. List<T>.CopyTo and Array.Empty were missing.
- Int32.Equals no longer accepts a boxed enum of the same number.
- new List<T>(negative) throws ArgumentOutOfRangeException.
- value.Equals(other) on a null receiver throws NullReferenceException; the
static object.Equals keeps its null tolerance.
- A collider on the Ignore Raycast layer neither receives mouse messages nor
hides the collider behind it.
- A canvas whose GraphicRaycaster is disabled is not hit-tested.
- Scene roots have sibling indices that can be read and reordered.
Boxing keeps the cached boxes: Jvm.box says what differs from .NET and why
an allocation per boxing conversion is not paid for it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: enum unboxing, pause on disabled scripts, seek before Play
Review findings:
- Unboxing a boxed enum to a type of another width or signedness throws
InvalidCastException, as .NET does; to its own underlying type, or to an
enum of the same storage, it still succeeds, which is also what .NET does.
`x is SomeEnum` tests the enum type rather than the storage.
- OnApplicationPause and OnApplicationFocus reach a disabled script on an
active object.
- Random.Range(10, 0) keeps each endpoint's role and answers 1..10.
- AddComponent can construct CapsuleCollider2D, EdgeCollider2D and
AudioSource; a test holds the registry to the components the runtime has.
- AudioSource.time set while stopped takes effect when playback begins.
- A build-settings list whose entries are all disabled or missing fails the
build naming them, rather than starting whichever scene comes first. An
empty list still builds every scene.
- Input.mousePresent reports the device, not whether touches simulate a
mouse.
- StartCoroutine answers null for a routine that ends before it yields.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: static state per closed generic type, frame clock, axes, events
Review findings:
- A static field of a generic type was one Java static for every
instantiation, so Singleton<GameManager> and Singleton<AudioManager>
shared their instance. Each constructed type now gets its own static
context (GenericStatics): a subclass per closed type whose class
initializer runs the type's static constructor once, as .NET does, passed
to static methods as a hidden last parameter and kept by instances. Forms
that cannot be keyed fail the build naming the site.
- Time.time advances at the start of the frame, so a WaitForSeconds,
Invoke or delayed Destroy begun in Start or a fixed step no longer counts
the frame it was started in.
- Enum.GetName compares the value at full width instead of truncating it to
the enum's storage.
- Key axes take gravity, sensitivity and snap from InputManager.asset.
- An animation event fires once per loop a tick crosses, in order.
- AudioSource stops every voice it started; a pitch the device cannot apply
is a build note.
Found on the way: `instance == null` inside a generic type constrained to a
class failed bytecode verification.
The macOS translator RAM row is rebaselined from this PR's runs and four
master controls: master measured 0.68 and 0.55 on two runs of one commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: primitive arrays to T[], string argument errors, contacts
Review findings:
- A primitive array passed where a generic member takes T[]
(List<int>.CopyTo(int[])) failed the build. It is passed as an array of
the right boxes and copied back after the call; List<T>.CopyTo gains its
four-argument overload. A constructor now runs the after-call steps a
method does.
- new string(c, negative) throws ArgumentOutOfRangeException, and the
string members around it throw the exception types .NET does.
- A looped sound keeps its current volume, and its mute, across the
restart at each loop.
- A collider pair touching through several contacts keeps reporting one
of the survivors to OnCollisionStay2D until it separates.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: unbiased Range, CompareTo errors, arrays as collections
Review findings:
- Random.Range over integers redraws a sample past the last whole multiple
of the span instead of reducing it with a biased modulo. Small spans
almost never redraw, so seeded sequences are unchanged.
- IComparable.CompareTo throws NullReferenceException for a null receiver
before looking at its argument, and ArgumentException for an argument of
another type, as .NET does.
- An array viewed as ICollection<T> implements it (Count; Clear throws
NotSupportedException, as an array does).
- UnityGameView restores Display's multi-key mode when the last view goes,
if it was the views that turned it on.
- The unchanged-project fast path requires every part of the output it
would otherwise write, so a partial cache is compiled again.
- GetComponentInParent skips inactive ancestors; the object itself is
always searched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: string receivers, listener volume, closed delegate types, axis invert
- An instance string Equals/CompareTo on a null receiver throws
NullReferenceException; static string.Equals stays null-tolerant.
Equals(string, StringComparison) added.
- AudioListener.volume scales every voice already playing.
- Delegates made where the closed type is known carry it, so Combine of
Action<int> and Action<string> (or a variant Action<object>) throws as
.NET does.
- InputManager invert is honoured for key and mouse axes.
- ContactFilter2D.ClearDepth/ClearNormalAngle keep the bounds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* perf baseline: Windows x64 AMD 26/2 stringBuilding RAM pooled from master runs
pr/6010.json set 0.175x from a single run; master's own runs 38346386877
and 38226452649 on that model measure 0.267x, as does this PR's run
38519282184.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: typeof on constructed types, delegate keys in generic code, event and clone fixes
- typeof of a constructed generic type carries its arguments, so
typeof(List<int>) != typeof(List<string>); one cached Type per closed type.
- Delegates made in generic code that has a per-closed-type context get a
closed type key; the remaining null-key cases are documented.
- UnityEvent skips runtime listeners whose target is destroyed and ignores
a duplicate AddListener, as documented.
- CinemachineVirtualCamera remaps Follow/LookAt when a hierarchy is cloned.
- UnityProjectBuilder replaces every output after a step reran, and writes
its state after install.
- InvokeRepeating comment states what the docs specify.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* perf baseline: macOS arm64 mathTranscendental RAM spans both modes
RAM is bimodal per round (~0.118x or ~0.04x); run 38536963726 had 3 of 5
rounds low and failed the gate as an improvement. Pooled with the PR's
earlier run and three master runs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: enumerator Reset, CompressBounds, particle children, raw axis, null params, pitch clamp
- List and Dictionary enumerators reset (InvalidOperationException once
the collection changed), as .NET does.
- Tilemap bounds are kept apart from the storage and CompressBounds
shrinks them to the occupied cells.
- Parameterless ParticleSystem Play/Stop/Pause/Clear include children.
- GetAxisRaw over same-named axes answers the largest magnitude.
- string.Concat/Format with a null array or format throw
ArgumentNullException.
- AudioSource.pitch is clamped to [-3, 3].
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: revoice on output reinstall, canvas hit order, pitch direction; GameView host presses
- AudioSource re-creates every playing source's voice at its position
when a different output is installed (a view shown again).
- UI raycast ranks canvases with the same keys as drawing.
- A paused (pitch 0) voice never expires; a reversed one ends at 0.
- GameView's form-level fallback starts a gesture only for a press inside
the view; a drag or release outside still ends one begun inside.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: inactive coroutines, null argument checks, large vector text
- StartCoroutine on an object inactive in the hierarchy runs nothing and
answers null.
- Array.Clear, Enumerable delegate overloads, Concat and ElementAt check
their arguments before touching the source, as .NET does.
- Value types format any finite component in full (F2/F3 invariant);
only a real infinity prints "Infinity".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: paused and detached keys, shared audio output, dead raycast hits, nested struct remap, prefs index
- Key presses made while paused or with the clock held are dropped and
only releases pass on; a view taken off its form releases every held key.
- Detaching one of two views clears the audio output only if it is still
that view's.
- RaycastHit2D is false once its collider is destroyed.
- Instantiate remaps Unity references inside serialized structs (fields,
arrays, lists) instead of a plain value copy.
- PlayerPrefs.DeleteKey removes the name from the persisted index.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* perf baseline: macOS arm64 recursion RAM spans both modes
RAM is bimodal per round (~0.118x or ~0.037x), on master's runs as well
as this PR's; run 38726563387 had 2 of 3 rounds low and failed the gate
as an improvement. Pooled with five earlier macOS runs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* perf baselines: rows master's merge moved, and the Flutter JS sizes
ParparVM gate, from run 38943915665/38943916211/38943915743 (first after
merging the Flutter runtime) and this PR's earlier same-model runs:
- macOS arm64 recursion time back to ~1.235x (14 runs, master's and
this PR's; pr/5883.json's 1.534x was one run).
- Windows arm64 d49 translator RAM 0.50x, the value before pr/5883.json
moved it to 0.43x from one run.
- hello RAM on macOS arm64 and Windows arm64 d49, which both fell in the
same post-merge run.
- Linux x64 EPYC 7763 translator time 0.49x.
Flutter benchmark: JavaScript executable and installed sizes, above a
baseline taken before later master merges; another PR without this one
is further above it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: trigger angle filter, checked Mathf.Abs, mass, loop remainder, detach release
- ContactFilter2D: a trigger is never filtered by the normal angle, as
Unity documents for useTriggers.
- Mathf.Abs(int) goes through System.Math.Abs: Unity documents a
non-negative result, which the smallest int cannot have.
- Rigidbody2D.mass refuses a value that is not positive, so the property
and the simulation agree.
- A looping ParticleSystem keeps the time a step runs past its end and
fires the bursts of every cycle the step crosses.
- GameView lets go of the on-screen controls and the pointer when it is
detached in the middle of a touch.
- The Unity gallery prebuilt cache key hashes the whole plugin,
build-engine and project-model.
- Comments record why String.Split with one null separator and the
fixed default Random seed stay as they are.
- perf: macOS objectAllocation RAM recorded on top of #5984's row.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: mirrored UI rects, transition events, clip replacement
- RectTransform answers a positive width and height when a scale
mirrors it, with the mirror in the scale's sign; the canvas draws it
flipped. A negative extent failed every hit test and dropped its text.
menu2d mirrors its play button, which still takes the click.
- Animator sends the incoming clip's events while a transition blends
it in; they were skipped. platformer2d's Idle->Proud blend now lasts
0.21 s and its 0.2 s event still arrives.
- Assigning AudioSource.clip stops the voice playing another clip, as
Unity documents, so the voice and the clip that times it agree.
- perf: Windows x64 Intel model 207 recursion recorded in its upper
mode; the row is bimodal across base folds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: mouse skips triggers, owned entry point, one-shot volume
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: one-shots in isPlaying and Pause, rawPosition origin, simulated mouse release, negative timeScale
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: disabled CanvasScaler, destroys requested during unload
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: hidden methods keep static binding, null ldvirtftn/unbox, nested particle children, no stale routing
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: rethrow keeps identity, brain rotation, destroyed particle cache, rotated and gapped tile colliders
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: deactivation stops coroutines, log-space canvas match, live Cinemachine body, particle start delay remainder
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: one-shots on a fresh output, non-loop emission ends at duration, float to ulong upper half, destroyed tilemap cache
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: JS float ties print the even digit, destroyed brain camera re-resolved, overflowing format index refused
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: early zero-delay Invoke, reparented children detach on destroy, OverlapPoint auto-sync, pitch reaches one-shots, sprite-less Image draws its color
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: typed ValueTuple Equals, value-type tuple defaults where the type arguments are known
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: .NET Exception.ToString, Single equality in RaycastHit2D, reparented tilemap re-resolves its grid, importer replaces a file that became a folder
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: nested canvas laid out by its parent, overlay canvases drawn without a camera, EPYC 7763 hello RAM row pooled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: destroyed canvas camera falls back to overlay, bounded time scale and finite advance, importer skips links inside the project
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* GameView: a press on a host control over the view is not the game's; Unity compat: Stop rationale names its evidence
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: IEquatable keys and elements, blank constructor for serializable classes, looping emission split per cycle, ContactFilter2D float equality; GameView NOPMD
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: import record keeps names with two dots, source hashing skips linked directories
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: enabled Cinemachine body wins over a disabled one, latest-enabled camera breaks priority ties, Java-keyword C# names escaped; ScreenY direction documented
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: Array.Clear keeps erased struct arrays, per-particle random gravity, fullPathHash with the layer; SpriteRenderer never runs a frame backwards; disabled-control rationale
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: LINQ Contains asks IEquatable, base-type FindObjectsOfType includes GameObjects, scene compiler skips linked directories
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: fixed-step and particle-cycle loops end when a step makes no progress, coroutine listed before its first step, serialized ulong read unsigned
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: exact world basis for rotated children of unevenly scaled or mirrored parents, Cinemachine tracked offset in target space, cast centroid includes the collider offset
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: importer replaces a destination link and refuses backslashed record paths, hexadecimal scene floats decoded, bounded particle emission; destroy-timing rationale
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: importer refuses a linked import root, Random.Range spans past the float range, project fixed timestep sets the unscaled interval, bounded animation-event replay; sheared-sprite rationale
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: FormerlySerializedAs aliases and Unity's serialization rules in scenes, editor version symbols for scripts, UI input after fixed steps; GameView lets go on a cancelled gesture (Form.addPointerCancelledListener)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: erased struct-array Clone copies elements, dictionary enumerators keep the yielded entry; NavigationTest uninstalls its dispatcher and ResultAfterRelaunchTest starts in light mode (order-dependent CI failures)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: world rotation independent of parent scale, infinite normal-angle bounds, persistent calls pick the recorded overload and resolve asset arguments; weighted-tangent build warning
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: script fields named m_* are serialized, transposer binding mode turns the offset with the target, LoadScene accepts extensionless paths and any case
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: removed GameObject prefab overrides drop the subtree, every YAML escape decodes, negative one-shot volume is silence; the importer ignores a runtime named only in comments or dependency management
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: containers of containers are not serialized fields; Component walks pointer listeners by index (ComponentTest ConcurrentModificationException)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: stale-import cleanup never deletes through a linked folder; Component's listener walk documents why it takes no lock
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: particle cycle loop cannot stall on a tiny duration, Math.Exp keeps finite results to the true boundary, cleanup records reject only a .. component, StopCoroutine stops only its own coroutines
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Unity compat: stale install records that climb out of the classes directory are ignored when reinstalling
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* perf-baseline: the website summary leaves out an overlay that does not resolve instead of failing the Hugo build; the gate's check tests run on a throwaway tree, not the repository's overlays
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
What this is
scripts/waylineis a modern successor to the ride-hailing app of "Create an Uber clone in 14 days": one Maven project in one language, a Codename One app styled with CSS and a Codename One Backend server. The roles the server gives an account decide what it opens on: a rider's map, a driver's screen or an administrator's console. It runs on phones, as a desktop app, and hosted by its own server in a browser.@Transactionalservices, Flyway-style migrations (per-engine variants where the SQL differs), matching, a ride state machine that settles races in the database, simulated or Stripe payments, a WebSocket live channel.scripts/sync-initializr-wayline.py(CI fails on drift). The grub and tweet templates are removed.Framework changes the sample needed or uncovered
cn1:backend-webappand the GradlebackendWebApptask: build the app for the browser and let the server host it.ResponseStatusException;ConcurrencyFailureExceptionfor write conflicts and deadlocks (MariaDB's snapshot isolation reports error 1020 where other engines change no row).FrameRetireLiveReceiverIntegrationTest).GridLayoutpreferred height counts implicit rows;GeneralPathgrows geometrically; JavaSE mixed-font width uses advances.Testing
Run locally on the merged tree:
scripts/wayline/screenshots.run-web-e2e.shin headless Chromium.Not verified:
.github/workflows/wayline.ymlhas never run on GitHub.🤖 Generated with Claude Code